﻿using System;
using System.Collections.Generic;
using System.Text;
using System.Data;
using System.Data.Common;
using ProtocolVN.Framework.Core;
using ProtocolVN.DanhMuc;

namespace ProtocolVN.Framework.Win
{
    /// <summary>
    /// DUYVT
    /// Các hàm hỗ trợ xử lý tồn kho
    /// </summary>
    public class KhoTonKhoHelp
    {
        #region Hỗ trợ Update Kho Ton Kho
        /// <summary>
        /// Lấy dữ liệu chuẩn bị cho việc lưu DB
        /// </summary>
        /// <param name="Src">Loại phiếu Src</param>
        /// <param name="SrcID">ID phiếu Src</param>
        /// <param name="DOX">Đối tượng DOPhieuX</param>
        /// <returns>Danh sách các đối tượng DOFWObjRelData</returns>
        public static List<DOFWObjRelData> GetData(PLTransaction plTrans, long Src, long SrcID, DOPhieuX DOX)
        {
            List<DOFWObjRelData> listObjRel = new List<DOFWObjRelData>();
            try
            {
                ITonKho data = (ITonKho)DOX;
                DataSet ds_hanghoa = data.GetTonKho().DataSet;

                DataSet PinMap_ds = Get_TableColumnMap(plTrans, DOX.GetPhieuType().GetTypeID());

                if (PinMap_ds != null && PinMap_ds.Tables.Count > 0)
                {
                    DataTable PinMap = PinMap_ds.Tables[0];
                    string HangHoa_ID = PinMap.Rows[0]["PIN_HANG_HOA"] != null ?
                        PinMap.Rows[0]["PIN_HANG_HOA"].ToString().Trim() : "";
                    string SoLuong = PinMap.Rows[0]["PIN_SO_LUONG"] != null ?
                        PinMap.Rows[0]["PIN_SO_LUONG"].ToString().Trim() : "";
                    string TrongLuong = PinMap.Rows[0]["PIN_TRONG_LUONG"] != null ?
                        PinMap.Rows[0]["PIN_TRONG_LUONG"].ToString().Trim() : "";
                    string DonGia = PinMap.Rows[0]["PIN_DON_GIA"] != null ?
                        PinMap.Rows[0]["PIN_DON_GIA"].ToString().Trim() : "";
                    string TTHTK_ID = PinMap.Rows[0]["PIN_TTHTK"] != null ?
                        PinMap.Rows[0]["PIN_TTHTK"].ToString().Trim() : "";

                    if (HangHoa_ID != "" && ds_hanghoa.Tables.Count > 0 &&
                        ds_hanghoa.Tables[0].Columns.Contains(HangHoa_ID))
                    {
                        foreach (DataRow dr in ds_hanghoa.Tables[0].Rows)
                        {
                            DOFWObjRelData ObjRel = new DOFWObjRelData();
                            ObjRel.SRC_ID = SrcID;
                            ObjRel.SRC_TYPE = Src;
                            ObjRel.DES_ID = DOX.GetID();
                            ObjRel.DES_TYPE = DOX.GetPhieuType().GetTypeID();
                            ObjRel.HH_ID = HelpNumber.ParseInt64(dr[HangHoa_ID]);
                            if (SoLuong != "" && ds_hanghoa.Tables[0].Columns.Contains(SoLuong))
                                ObjRel.SO_LG = HelpNumber.ParseDecimal(dr[SoLuong]);
                            if (TrongLuong != "" && ds_hanghoa.Tables[0].Columns.Contains(TrongLuong))
                                ObjRel.TONG_TR_LG = HelpNumber.ParseDecimal(dr[TrongLuong]);

                            ObjRel.NGUOI_CAP_NHAT = data.GetNguoiCapNhat();
                            ObjRel.NGAY_CAP_NHAT = data.GetNgayCapNhat();
                            ObjRel.NGUOI_PHAT_SINH = data.GetNguoiPhatSinh();
                            ObjRel.NGAY_PHAT_SINH = data.GetNgayPhatSinh();

                            string inout1 = PinMap.Rows[0]["INOUT1"].ToString();//INOUT1FromType(plTrans, ObjRel.DES_TYPE);
                            if (inout1 != "")
                            {
                                ObjRel.INOUT1 = inout1;
                                if (inout1 == "OUT" || inout1 == "IN")
                                    ObjRel.KHO_ID1 = data.GetKho1();
                            }
                            else
                                ObjRel.INOUT1 = "";
                            string inout2 = PinMap.Rows[0]["INOUT2"].ToString();//INOUT2FromType(plTrans, ObjRel.DES_TYPE);
                            if (inout2 == "OUT" || inout2 == "IN")
                            {
                                ObjRel.INOUT2 = inout2;
                                ObjRel.KHO_ID2 = data.GetKho2();
                            }
                            else
                                ObjRel.INOUT2 = "";

                            long dvt_id = DVTFromHH_ID(plTrans, ObjRel.HH_ID);
                            if (dvt_id != -1)
                                ObjRel.DON_VI_TINH = dvt_id;
                            if (DonGia != "" && ds_hanghoa.Tables[0].Columns.Contains(DonGia))
                                ObjRel.GIA = HelpNumber.ParseDecimal(dr[DonGia]);
                            if (TTHTK_ID != "" && ds_hanghoa.Tables[0].Columns.Contains(TTHTK_ID))
                                ObjRel.TINH_TRANG_HH = HelpNumber.ParseInt64(dr[TTHTK_ID]);
                            ObjRel.GHI_CHU = dr["GHI_CHU"] != null ? dr["GHI_CHU"].ToString() : "";
                            listObjRel.Add(ObjRel);
                        }
                        return listObjRel;
                    }
                    else
                        return listObjRel;
                }
                else
                    return listObjRel;
            }
            catch (Exception ex)
            {
                plTrans.Rollback();
                PLException.AddException(ex);
                return listObjRel;
            }
        }

        /// <summary>
        /// Lấy dữ liệu gốc từ DB
        /// </summary>
        /// <param name="plTrans">Đối tượng PLTransaction</param>        
        /// <param name="DOX">Đối tượng DOPhieuX</param>
        /// <returns>Danh sách các đối tượng DOFWObjRelData</returns>
        public static List<DOFWObjRelData> GetDataDesDB(PLTransaction plTrans, DOPhieuX DOX,long ky_id)
        {
            List<DOFWObjRelData> listObjRel = new List<DOFWObjRelData>();
            try
            {
                ITonKho data = (ITonKho)DOX;
                //long ky_id = KhoTonKhoHelp.GetKy(plTrans, data.GetNgayPhatSinh());
                DataSet ds = plTrans.LoadDataSet("kho_ton_kho_" + ky_id, "DES_ID", DOX.GetID());
                foreach (DataRow dr in ds.Tables[0].Rows)
                {
                    DOFWObjRelData ObjRel = new DOFWObjRelData();
                    ObjRel.ID_TEM = HelpNumber.ParseInt64(dr["ID_TEM"]);
                    ObjRel.SRC_ID = HelpNumber.ParseInt64(dr["SRC_ID"]);
                    ObjRel.SRC_TYPE = HelpNumber.ParseInt64(dr["SRC_TYPE"]);
                    ObjRel.DES_ID = HelpNumber.ParseInt64(dr["DES_ID"]);
                    ObjRel.DES_TYPE = HelpNumber.ParseInt64(dr["DES_TYPE"]);
                    ObjRel.HH_ID = HelpNumber.ParseInt64(dr["HH_ID"]);
                    ObjRel.SO_LG = HelpNumber.ParseDecimal(dr["SO_LG"]);
                    ObjRel.TONG_TR_LG = HelpNumber.ParseDecimal(dr["TONG_TR_LG"]);
                    ObjRel.NGUOI_CAP_NHAT = HelpNumber.ParseInt64(dr["NGUOI_CAP_NHAT"]);
                    ObjRel.NGAY_CAP_NHAT = (DateTime?)DateTime.Parse(dr["NGAY_CAP_NHAT"].ToString());
                    ObjRel.NGUOI_PHAT_SINH = HelpNumber.ParseInt64(dr["NGUOI_PHAT_SINH"]);
                    ObjRel.NGAY_PHAT_SINH = (DateTime?)DateTime.Parse(dr["NGAY_PHAT_SINH"].ToString());
                    ObjRel.INOUT1 = dr["INOUT1"].ToString();
                    ObjRel.KHO_ID1 = HelpNumber.ParseInt64(dr["KHO_ID1"]);
                    ObjRel.INOUT2 = dr["INOUT2"].ToString();
                    ObjRel.KHO_ID2 = HelpNumber.ParseInt64(dr["KHO_ID2"]);
                    ObjRel.DON_VI_TINH = HelpNumber.ParseInt64(dr["DON_VI_TINH"]);
                    ObjRel.GIA = HelpNumber.ParseDecimal(dr["GIA"]);
                    ObjRel.TINH_TRANG_HH = HelpNumber.ParseInt64(dr["TINH_TRANG_HH"]);
                    listObjRel.Add(ObjRel);
                }                
                return listObjRel;
            }
            catch (Exception ex)
            {
                plTrans.Rollback();
                PLException.AddException(ex);
                return listObjRel;
            }       
        }

        /// <summary>
        /// Kiểm tra đối tượng DOFWObjRelData có trong danh sách hay không dựa vào 
        /// des_id, des_type, hh_id, tinh_trang_hh
        /// </summary>
        /// <param name="listObjRel">Danh sách đối tượng DOFWObjRelData</param>
        /// <param name="objRel">Đối tượng DOFWObjRelData cần kiểm tra</param>
        /// <returns></returns>
        public static bool Check_DOFWObjRelDataInList(List<DOFWObjRelData> listObjRel, DOFWObjRelData objRel)
        {
            foreach (DOFWObjRelData obj in listObjRel)
            {
                if ((obj.DES_ID == objRel.DES_ID) && (obj.DES_TYPE == objRel.DES_TYPE)
                    && (obj.HH_ID == objRel.HH_ID) && (obj.TINH_TRANG_HH == objRel.TINH_TRANG_HH))                
                    return true;                
            }
            return false;
        }

        /// <summary>
        /// Lấy tên bảng, cột của 1 loại phiếu chỉ định (Support cho GetData và GetDataDes)
        /// </summary>
        /// <param name="loaiphieu_id">Loại phiếu</param>
        /// <returns>DataSet chứa 1 DataTable miêu tả tên bảng và các cột</returns>
        private static DataSet Get_TableColumnMap(PLTransaction plTrans, long loaiphieu_id)
        {
            try
            {
                DbCommand cmd_Select = plTrans.db.GetStoredProcCommand("FW_TON_KHO_LAY_TEN_BANG_COT");
                plTrans.db.AddInParameter(cmd_Select, "@LOAI_PHIEU_ID", DbType.Int64, loaiphieu_id);
                DataSet ds = new DataSet();
                plTrans.LoadDataSet(ds, cmd_Select);
                
                return ds;
            }
            catch (Exception ex)
            {
                plTrans.Rollback();
                PLException.AddException(ex);
                return null;
            }
        }

        public static bool Check_Exist_ID(PLTransaction plTrans, long ky_id, 
            long hh_id, long tthtk_id, long des_id, long des_type)
        {
            try
            {
                DatabaseFB db = plTrans.db;

                //DbCommand cmd1 = db.GetStoredProcCommand("FW_KY_GET_KY_KD");
                //db.AddInParameter(cmd1, "@I_NGAY", DbType.DateTime, ngayhientai);
                //DataSet ds = new DataSet();
                //plTrans.LoadDataSet(ds, cmd1, "NOOP");
                //DataTable dt = ds.Tables[0];
                //long KyID = HelpNumber.ParseInt64(dt.Rows[0][0]);

                string strsql = "select fw.des_id from kho_ton_kho_" + ky_id + " fw " +
                            "where fw.des_id=" + des_id + " and fw.des_type=" + des_type +
                            " and fw.hh_id=" + hh_id + " and fw.tinh_trang_hh=" + tthtk_id;
                DbCommand cmd = db.GetSQLStringCommand(strsql);
                DataSet ds1 = new DataSet();
                plTrans.LoadDataSet(ds1, cmd, "NOOP");
                DataTable dtkq = ds1.Tables[0];

                if ((dtkq != null) && (dtkq.Rows.Count > 0)) return true;// neu da co dong du lieu
                else return false; // neu chua co dong du lieu
            }
            catch { return false; }
        }

        /// <summary>
        /// Lấy kỳ kinh doanh dựa vào ngày phát sinh (có giao tác)
        /// </summary>
        /// <param name="plTrans">Giao tác dùng chung</param>
        /// <param name="ngay_phat_sinh">Ngày phát sinh</param>
        /// <returns>ID kỳ kinh doanh</returns>
        public static long GetKy(PLTransaction plTrans, DateTime? ngay_phat_sinh)
        {
            try
            {
                DatabaseFB db = plTrans.db;
                DbCommand cmd_Get = plTrans.db.GetStoredProcCommand("FW_KY_GET_KY_KD");
                db.AddInParameter(cmd_Get, "@i_ngay", DbType.DateTime, ngay_phat_sinh);
                db.AddOutParameter(cmd_Get, "@o_ky_id", DbType.Int64, 1);
                db.ExecuteNonQuery(cmd_Get, plTrans.dbTrans);

                object ky_id = db.GetParameterValue(cmd_Get, "@o_ky_id");
                if (ky_id != null)
                    return HelpNumber.ParseInt64(ky_id);
                else
                    return -1;
            }
            catch {
                return -1;
            }
        }

        /// <summary>
        /// Lấy kỳ kinh doanh dựa vào ngày phát sinh (không giao tác)
        /// </summary>
        /// <param name="ngay_phat_sinh">Ngày phát sinh</param>
        /// <returns>ID kỳ kinh doanh</returns>
        public static long GetKy(DateTime? ngay_phat_sinh)
        {
            try
            {
                DatabaseFB db = DABase.getDatabase();
                DbCommand cmd_Get = db.GetStoredProcCommand("FW_KY_GET_KY_KD");
                db.AddInParameter(cmd_Get, "@i_ngay", DbType.DateTime, ngay_phat_sinh);
                db.AddOutParameter(cmd_Get, "@o_ky_id", DbType.Int64, 1);
                db.ExecuteNonQuery(cmd_Get);

                object ky_id = db.GetParameterValue(cmd_Get, "@o_ky_id");
                if (ky_id != null)
                    return HelpNumber.ParseInt64(ky_id);
                else
                    return -1;
            }
            catch
            {
                return -1;
            }
        }
        
        /// <summary>
        /// Cập nhật lại trạng thái hàng hóa là Invisible 
        /// trong danh mục hàng hóa(và loại bỏ những hàng hóa đó ra khỏi bảng tồn kho) 
        /// nếu như tại thời điểm tính tồn kho số lượng 
        /// tồn của tất cả hàng hóa có cùng mã đều = 0         
        /// </summary>
        public static void CapNhatTrangThaiHangHoa()
        {
            try
            {
                DatabaseFB db = DABase.getDatabase();
                DbCommand cmd_CapNhat = db.GetStoredProcCommand("KHO_TON_KHO_CAPNHAT_TRANGTHAI");
                db.ExecuteNonQuery(cmd_CapNhat);
            }
            catch { }
        }

        /// <summary>
        /// Lấy số lượng tồn của hàng hóa tại kỳ tồn kho hiện tại
        /// </summary>
        /// <param name="hh_id">ID hàng hóa</param>
        /// <param name="kho_id">ID kho</param>
        /// <param name="tthtk_id">ID tình trạng hàng tồn</param>
        /// <returns>Số lượng hàng tồn</returns>
        public static decimal GetSoLuongTon(long hh_id, long kho_id, long tthtk_id)
        {
            try
            {
                string sql = "select so_luong_cuoi_ky from kho_ton_kho_" + 
                    DMKyKinhDoanh.get_KyTonKho_Max() +
                        "_dau_ky where hh_id=" + hh_id +
                        " and kho_id=" + kho_id + " and tthtk_id=" + tthtk_id;
                DataSet ds = new DataSet();
                DABase.getDatabase().LoadDataSet(ds, sql, "AAA");
                DataTable dtkq = ds.Tables[0];
                if ((dtkq != null) && (dtkq.Rows.Count > 0))
                {
                    return HelpNumber.ParseDecimal(dtkq.Rows[0][0]);
                }
                return 0;
            }
            catch {
                return 0;
            }
        }

        /// <summary>
        /// Lấy trọng lượng tồn của hàng hóa tại kỳ tồn kho hiện tại
        /// </summary>
        /// <param name="hh_id">ID hàng hóa</param>
        /// <param name="kho_id">ID kho</param>
        /// <param name="tthtk_id">ID tình trạng hàng tồn</param>
        /// <returns>Trọng lượng hàng tồn</returns>
        public static decimal GetTrongLuongTon(long hh_id, long kho_id, long tthtk_id)
        {
            try
            {
                string sql = "select trong_luong_cuoi_ky from kho_ton_kho_" + 
                    DMKyKinhDoanh.get_KyTonKho_Max() +
                        "_dau_ky where hh_id=" + hh_id +
                        " and kho_id=" + kho_id + " and tthtk_id=" + tthtk_id;
                DataSet ds = new DataSet();
                DABase.getDatabase().LoadDataSet(ds, sql, "AAA");
                DataTable dtkq = ds.Tables[0];
                if ((dtkq != null) && (dtkq.Rows.Count > 0))
                {
                    return HelpNumber.ParseDecimal(dtkq.Rows[0][0]);
                }
                return 0;
            }
            catch
            {
                return 0;
            }
        }

        /// <summary>
        /// Kiểm tra số lượng, trọng lượng hàng hóa(hh_id, kho_id, tthtk_id) có đủ cung cấp hay không
        /// </summary>
        /// <param name="hh_id">ID hàng hóa</param>
        /// <param name="kho_id">ID kho</param>
        /// <param name="tthtk_id">ID tình trạng hàng tồn</param>
        /// <param name="so_luong">Số lượng cần cung cấp</param>
        /// <param name="trong_luong">Trọng lượng cần cung cấp</param>
        /// <returns></returns>
        public static int CheckHangHoaTonKhoIsHopLe(long hh_id, long kho_id, 
            long tthtk_id, long kkd_id, decimal so_luong, decimal trong_luong)
        {
            try
            {                
                DatabaseFB db = DABase.getDatabase();                
                string sql = "select hh_id,kho_id,tthtk_id,trong_luong_cuoi_ky," +
                    "so_luong_cuoi_ky from kho_ton_kho_" + kkd_id + 
                    "_dau_ky where hh_id=" + hh_id + 
                    " and kho_id=" + kho_id + " and tthtk_id=" + tthtk_id;
                DbCommand cmd_Get = db.GetSQLStringCommand(sql);
                DataSet ds = new DataSet();
                db.LoadDataSet(cmd_Get, ds, "AAA");
                DataTable dtkq = ds.Tables[0];
                if ((dtkq != null) && (dtkq.Rows.Count > 0))
                {
                    decimal so_luong_ton = HelpNumber.ParseDecimal(dtkq.Rows[0]["SO_LUONG_CUOI_KY"]);
                    decimal trong_luong_ton = HelpNumber.ParseDecimal(dtkq.Rows[0]["TRONG_LUONG_CUOI_KY"]);
                    if ((so_luong_ton >= so_luong) && (trong_luong_ton >= trong_luong))
                    { 
                        //duchs: chen them 1 trường hợp nếu mà so_luong_ton-so_luong=0 và trong_luong_ton-trong_luong>0
                        //hoac nguoc lại thì thông báo không hợp lệ và bắt nhập lại.
                        if (((so_luong_ton - so_luong == 0) && (trong_luong_ton - trong_luong > 0))
                            || ((so_luong_ton - so_luong > 0) && (trong_luong_ton - trong_luong == 0)))
                            return -6;
                        else  return 0;
                    }
                    else
                    {
                        if ((so_luong_ton < so_luong) && (trong_luong_ton >= trong_luong))
                            return -1;
                        else if ((so_luong_ton >= so_luong) && (trong_luong_ton < trong_luong))
                            return -2;
                        else
                            return -3;
                    }
                }
                else
                {
                    return -4;
                }
            }
            catch { 
                return -5; 
            }
        }        

        /// <summary>
        /// Kiểm tra kỳ có phải là kế cuối hay không
        /// </summary>
        /// <param name="kkd_id">ID kỳ cần kiểm tra</param>
        /// <returns>Y/N</returns>
        public static bool CheckIsKyKeCuoi(long kkd_id)
        {
            try
            {
                DatabaseFB db = DABase.getDatabase();
                DbCommand cmd_Get = db.GetStoredProcCommand("FW_KY_GET_KY_KE_CUOI");

                DataSet ds = new DataSet();
                db.LoadDataSet(cmd_Get, ds, "AAA");
                DataTable dtkq = ds.Tables[0];
                if ((dtkq != null) && (dtkq.Rows.Count > 0))
                {
                    object kkd_ke_cuoi_id = dtkq.Rows[0][0];
                    if (kkd_ke_cuoi_id != null)
                    {
                        if (HelpNumber.ParseInt64(kkd_ke_cuoi_id) == kkd_id)
                            return true;                        
                    }                    
                }               
                return false;
            }
            catch {
                return false;
            }
        }

        /// <summary>
        /// Kiểm tra xem ngày tạo phiếu có thuộc kỳ kho tồn kho chưa khóa sổ hay không
        /// </summary>        
        /// <param name="ngay_tao">Ngày tạo phiếu</param>
        /// <returns>Y/N</returns>
        public static bool CheckNgayTao_KhoTonKhoHopLe(DateTime? ngay_tao)
        {
            try
            {
                DatabaseFB db = DABase.getDatabase();
                DbCommand cmd_Get = db.GetStoredProcCommand("FW_KY_GET_KY_KD");
                db.AddInParameter(cmd_Get, "@i_ngay", DbType.DateTime, ngay_tao);

                DataSet ds = new DataSet();
                db.LoadDataSet(cmd_Get, ds, "AAA");
                DataTable dtkq = ds.Tables[0];
                if ((dtkq != null) && (dtkq.Rows.Count > 0))
                {
                    object is_khoa_so = dtkq.Rows[0]["O_KHOA_SO"];
                    if (is_khoa_so != null && is_khoa_so.ToString() != string.Empty)
                    {
                        if (is_khoa_so.ToString() == "Y")
                            return false;
                        return true;
                    }
                }
                return false;
            }
            catch {
                return false;
            }
        }

        /// <summary>
        /// Kiểm tra xem ngày tạo phiếu ban đầu có thuộc kỳ kho tồn kho XYZ chưa khóa sổ hay không
        /// và ngày tạo đã thay đổi có thuộc kỳ XYZ luôn hay không
        /// </summary>
        /// <param name="ngay_tao_ban_dau">Ngày tạo ban đầu</param>
        /// <param name="ngay_tao_thay_doi">Ngày tạo sau khi đã sửa đổi</param>
        /// <returns>Số chỉ định kiểu lỗi</returns>
        public static int CheckNgayTao_KhoTonKhoHopLe(DateTime? ngay_tao_ban_dau, 
            DateTime? ngay_tao_thay_doi)
        {
            try
            {
                int flag = 0;
                DateTime? tu_ngay = null;
                DateTime? den_ngay = null;

                DatabaseFB db = DABase.getDatabase();
                DbCommand cmd_Get = db.GetStoredProcCommand("FW_KY_GET_KY_KD");
                db.AddInParameter(cmd_Get, "@i_ngay", DbType.DateTime, ngay_tao_ban_dau);

                DataSet ds = new DataSet();
                db.LoadDataSet(cmd_Get, ds, "AAA");
                DataTable dtkq = ds.Tables[0];
                if ((dtkq != null) && (dtkq.Rows.Count > 0))
                {
                    object is_khoa_so = dtkq.Rows[0]["O_KHOA_SO"];
                    tu_ngay = (DateTime?)DateTime.Parse(dtkq.Rows[0]["O_TU_NGAY"].ToString());
                    if (dtkq.Rows[0]["O_DEN_NGAY"].ToString() != "")
                        den_ngay = (DateTime?)DateTime.Parse(dtkq.Rows[0]["O_DEN_NGAY"].ToString());
                    if (is_khoa_so != null)
                    {
                        if (is_khoa_so.ToString() == "Y")
                            flag = -1; //Đã khóa sổ
                        else
                        {
                            if (den_ngay != null)
                            {
                                if ((ngay_tao_thay_doi < tu_ngay) || (ngay_tao_thay_doi > den_ngay))
                                    flag = -2;                                
                            }
                            else
                            {
                                if (ngay_tao_thay_doi < tu_ngay)
                                    flag = -2;                                
                            }
                        }
                    }                    
                }
                return flag;
            }
            catch
            {
                return -3;
            }          
        }

        /// <summary>
        /// Kiểm tra phiếu được tạo có ngày tạo thuộc kỳ tồn kho hiện tại hay không
        /// </summary>
        /// <param name="ngay_tao">Ngày tạo phiếu</param>
        /// <returns>Y/N</returns>
        public static bool Check_TaoPhieuTrongKyTonKho(DateTime? ngay_tao)
        {
            try
            {
                DatabaseFB db = DABase.getDatabase();
                DbCommand cmd_Get = db.GetStoredProcCommand("FW_KY_GET_KY_KD");
                db.AddInParameter(cmd_Get, "@i_ngay", DbType.DateTime, ngay_tao);

                DataSet ds = new DataSet();
                db.LoadDataSet(cmd_Get, ds, "AAA");
                DataTable dtkq = ds.Tables[0];
                if ((dtkq != null) && (dtkq.Rows.Count > 0))
                {
                    object ky_id = dtkq.Rows[0]["O_KY_ID"];
                    if (ky_id != null)
                    {
                        if (HelpNumber.ParseInt64(ky_id) != DMKyKinhDoanh.get_KyTonKho_Max())
                            return false;
                        return true;
                    }
                }
                return false;
            }
            catch
            {
                return false;
            }
        }

        //DUCHS: LAY VE TEN BANG KHO_TON_KHO_..._DAU_KY THEO KY
        public static string GetNameTonKhoTheoKy(PLTransaction plTrans, DateTime? ngay_phat_sinh)
        {            
            return "KHO_TON_KHO_"+ GetKy(plTrans,ngay_phat_sinh)+"_DAU_KY";
        }

        public static bool Check_PLQ(PLTransaction plTrans, long ky_id, 
            long des_id, long des_type)
        {
            try
            {
                DatabaseFB db = plTrans.db;

                //DbCommand cmd1 = db.GetStoredProcCommand("FW_KY_GET_KY_KD");
                //db.AddInParameter(cmd1, "@I_NGAY", DbType.DateTime, ngay_phat_sinh);                
                //DataSet ds = new DataSet();
                //plTrans.LoadDataSet(ds, cmd1, "NOOP");
                //DataTable dt = ds.Tables[0];
                //long KyID = HelpNumber.ParseInt64(dt.Rows[0][0]);
                                
                string strsql = "select * from kho_ton_kho_" + ky_id + " f " +
                                "where f.src_id=" + des_id + " and f.src_type=" + des_type;
                DbCommand cmd = db.GetSQLStringCommand(strsql);
                DataSet ds1 = new DataSet();
                plTrans.LoadDataSet(ds1, cmd, "NOOP");
                DataTable dtkq = ds1.Tables[0];

                if ((dtkq != null) && (dtkq.Rows.Count > 0)) return true;// neu da co dong du lieu
                else return false; // neu chua co dong du lieu
            }
            catch { 
                return false; 
            }
        }
        #endregion        

        /// <summary>
        /// Lấy đơn vị tính của hàng hóa
        /// </summary>
        /// <param name="hanghoa_id">Hàng hóa ID</param>
        /// <returns>Đơn vị tính của hàng hóa</returns>
        private static long DVTFromHH_ID(PLTransaction plTrans, long hanghoa_id)
        {
            try
            {
                DatabaseFB db = plTrans.db;
                DbTransaction trans = plTrans.dbTrans;
                string sql = "select dvt_id from dm_hang_hoa where id='" + hanghoa_id + "'";                
                DbCommand cmd_DVT = db.GetSQLStringCommand(sql);
                object dvt_id = db.ExecuteScalar(cmd_DVT, trans);
                return dvt_id != null ? HelpNumber.ParseInt64(dvt_id) : -1;                    
            }
            catch {
                return -1;
            }
        }

        /// <summary>
        /// Lấy Nhập/Xuất 1 từ loại phiếu
        /// </summary>
        /// <param name="loaiphieu_id">ID loại phiếu</param>
        /// <returns>Chuỗi cho biết phiếu là thuộc loại Nhập/Xuất</returns>
        private static string INOUT1FromType(PLTransaction plTrans, long loaiphieu_id)
        {
            try
            {
                DatabaseFB db = plTrans.db;
                DbTransaction trans = plTrans.dbTrans;
                string sql = "select inout1 from TB_TYPE_ID where id='" + loaiphieu_id + "'";                
                DbCommand cmd_INOUT1 = db.GetSQLStringCommand(sql);
                object inout1 = db.ExecuteScalar(cmd_INOUT1, trans);
                return inout1 != null ? inout1.ToString() : "";
            }
            catch
            {
                return "";
            }
        }

        /// <summary>
        /// Lấy Nhập/Xuất 2 từ loại phiếu
        /// </summary>
        /// <param name="loaiphieu_id">ID loại phiếu</param>
        /// <returns>Chuỗi cho biết phiếu là thuộc loại Nhập/Xuất</returns>
        private static string INOUT2FromType(PLTransaction plTrans, long loaiphieu_id)
        {
            try
            {
                DatabaseFB db = plTrans.db;
                DbTransaction trans = plTrans.dbTrans;
                string sql = "select inout2 from TB_TYPE_ID where id='" + loaiphieu_id + "'";                
                DbCommand cmd_INOUT2 = db.GetSQLStringCommand(sql);
                object inout2 = db.ExecuteScalar(cmd_INOUT2, trans);
                return inout2 != null ? inout2.ToString() : "";
            }
            catch
            {
                return "";
            }
        }

        /// <summary>
        /// Cập nhật thông tin ghi chú cho hàng hóa trong kho (không giao tác)
        /// </summary>
        /// <param name="kkd_id">Kỳ kinh doanh ID</param>
        /// <param name="hh_id">Hàng hóa ID</param>
        /// <param name="kho_id">Kho ID</param>
        /// <param name="tthtk_id">Tình trạng hàng hóa ID</param>
        /// <param name="ghi_chu">Ghi chú</param>
        public static void UpdateGhiChu(long kkd_id, long hh_id, long kho_id, 
            long tthtk_id, string ghi_chu)
        {
            try
            {
                DatabaseFB db = DABase.getDatabase();
                string sql = "update kho_ton_kho_" + kkd_id + "_dau_ky set "
                           +" ghi_chu='" + ghi_chu + "' where hh_id=" + hh_id +
                             " and kho_id=" + kho_id + " and tthtk_id=" + tthtk_id;                    
                DbCommand cmd_Update = db.GetSQLStringCommand(sql);
                db.ExecuteNonQuery(cmd_Update);
            }
            catch { }
        }

        /// <summary>
        /// Cập nhật thông tin ghi chú cho hàng hóa trong kho (có giao tác)
        /// </summary>
        /// <param name="plTrans">Đối tượng giao tác</param>
        /// <param name="kkd_id">Kỳ kinh doanh ID</param>
        /// <param name="hh_id">Hàng hóa ID</param>
        /// <param name="kho_id">Kho ID</param>
        /// <param name="tthtk_id">Tình trạng hàng hóa ID</param>
        /// <param name="ghi_chu">Ghi chú</param>
        public static void UpdateGhiChu(PLTransaction plTrans, long kkd_id, 
            long hh_id, long kho_id, long tthtk_id, string ghi_chu)
        {
            try
            {
                DatabaseFB db = plTrans.db;
                DbTransaction dbTrans = plTrans.dbTrans;
                string sql = "update kho_ton_kho_" + kkd_id +
                    "_dau_ky set ghi_chu='" + ghi_chu + "' where hh_id=" + hh_id +
                    " and kho_id=" + kho_id + " and tthtk_id=" + tthtk_id +
                    " and ((ghi_chu is null) or (ghi_chu=''))"; 
                DbCommand cmd_Update = db.GetSQLStringCommand(sql);
                db.ExecuteNonQuery(cmd_Update, dbTrans);
            }
            catch { }
        }
        /// <summary>
        /// Cập nhật thông tin ghi chú giá bán giá cif vào 3 bảng:dm_hang_hoa
        /// ,kho_ton_kho_kkd_id_dau_ky,gia_ban_tham_khao(không giao tác)
        /// </summary>
        /// <param name="kkd_id">Kỳ kinh doanh ID</param>
        /// <param name="hh_id">Hàng hóa ID</param>
        /// <param name="kho_id">Kho ID</param>
        /// <param name="tthtk_id">Tình trạng hàng hóa ID</param>
        /// <param name="ghi_chu">Ghi chú</param>
        /// <param name="ghi_chu">giá bán</param>
        /// <param name="ghi_chu">giá cif</param>
        public static void UpdateGhiChuGiaBanCIF(long kkd_id, long hh_id, long kho_id,
            long tthtk_id,long vth_id, string ghi_chu,decimal gia_ban,decimal gia_cif)
        {
            try
            {
                DatabaseFB db = DABase.getDatabase();

                DbCommand cmd_Update = db.GetStoredProcCommand("UPDATE_GHICHU_GIABAN_CIF");
                db.AddInParameter(cmd_Update, "@KYKD_ID", DbType.Int64, kkd_id);
                db.AddInParameter(cmd_Update, "@HH_ID", DbType.Int64, hh_id);
                db.AddInParameter(cmd_Update, "@KHO_ID", DbType.Int64, kho_id);
                db.AddInParameter(cmd_Update, "@TTHTK_ID", DbType.Int64, tthtk_id);
                db.AddInParameter(cmd_Update, "@VTH_ID", DbType.Int64, vth_id);
                db.AddInParameter(cmd_Update, "@GIA_BAN",DbType.Decimal,gia_ban);
                db.AddInParameter(cmd_Update, "@DON_GIA", DbType.Decimal, gia_cif);
                db.AddInParameter(cmd_Update, "@GHI_CHU", DbType.String, ghi_chu);
                db.ExecuteNonQuery(cmd_Update);
            }
            catch { }
        }
        /// <summary>
        /// Cập nhật thông tin ghi chú giá bán giá cif vào 3 bảng:dm_hang_hoa
        /// ,kho_ton_kho_kkd_id_dau_ky,gia_ban_tham_khao(không giao tác)
        /// </summary>
        /// /// <param name="plTrans">Đối tượng giao tác</param>
        /// <param name="kkd_id">Kỳ kinh doanh ID</param>
        /// <param name="hh_id">Hàng hóa ID</param>
        /// <param name="kho_id">Kho ID</param>
        /// <param name="tthtk_id">Tình trạng hàng hóa ID</param>
        /// <param name="ghi_chu">Ghi chú</param>
        /// <param name="ghi_chu">giá bán</param>
        /// <param name="ghi_chu">giá cif</param>
        public static bool UpdateGhiChuGiaBanCIF(PLTransaction plTrans, long kkd_id,
            long hh_id, long kho_id, long tthtk_id,long vth_id, string ghi_chu, decimal gia_ban, decimal gia_cif)
        {
            try
            {
                DatabaseFB db = plTrans.db;
                DbTransaction dbTrans = plTrans.dbTrans;              

                DbCommand cmd_Update = db.GetStoredProcCommand("UPDATE_GHICHU_GIABAN_CIF");
                db.AddInParameter(cmd_Update, "@KYKD_ID", DbType.Int64, kkd_id);
                db.AddInParameter(cmd_Update, "@HH_ID", DbType.Int64, hh_id);
                db.AddInParameter(cmd_Update, "@KHO_ID", DbType.Int64, kho_id);
                db.AddInParameter(cmd_Update, "@TTHTK_ID", DbType.Int64, tthtk_id);
                db.AddInParameter(cmd_Update, "@VTH_ID", DbType.Int64, vth_id);
                db.AddInParameter(cmd_Update, "@GIA_BAN", DbType.Decimal, gia_ban);
                db.AddInParameter(cmd_Update, "@DON_GIA", DbType.Decimal, gia_cif);
                db.AddInParameter(cmd_Update, "@GHI_CHU", DbType.String, ghi_chu);
                if (db.ExecuteNonQuery(cmd_Update, dbTrans) > 0) return true;
                else return false;
            }
            catch { return false; }
        }
        /// <summary>
        /// Phục hồi lại trạng thái DB khi khóa sổ không thành công
        /// </summary>
        /// <param name="ky_chot_id">ID kỳ chốt</param>
        /// <param name="ky_sau_id">ID kỳ sau</param>
        /// <param name="db">Đối tượng DatabaseFB</param>
        public static void RevertKC(long ky_chot_id, long ky_sau_id)
        {
            DatabaseFB db = DABase.getDatabase();
            DbTransaction dbTrans = PLTransaction.BeginTrans(db);
            PLTransaction plTrans = PLTransaction.I(db, dbTrans);

            if (DeleteTableDU_LIEU_DAU_KY(plTrans, ky_sau_id) 
                && DeleteTableDU_LIEU_TRONG_KY(plTrans, ky_sau_id))
                PLTransaction.Commit(dbTrans);
            else
                PLTransaction.Rollback(dbTrans);
        }

        /// <summary>
        /// Kiểm tra bảng đã tồn tại trong DB hay chưa
        /// </summary>
        /// <param name="table_name">Tên bảng cần kiểm tra</param>
        /// <returns>Số bảng tìm được (=0 -> bảng không tồn tại)</returns>
        public static int CheckTableExist(PLTransaction plTrans, string table_name)
        {
            DatabaseFB db = plTrans.db;
            DbTransaction dbTrans = plTrans.dbTrans;

            string sql = "SELECT COUNT(RDB$RELATION_NAME) as name " +
                "FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG=0 " +
                "AND RDB$VIEW_BLR IS NULL " +
                "AND (RDB$RELATION_NAME = '" + table_name + "')";            
            DbCommand check_tb = db.GetSQLStringCommand(sql);
            return (int)db.ExecuteScalar(check_tb, dbTrans);
        }

        /// <summary>
        /// Xóa bảng dữ liệu đầu kì của kỳ kinh doanh chỉ định
        /// </summary>
        /// <param name="ky_id">Kỳ kinh doanh cần xóa bảng</param>
        public static bool DeleteTableDU_LIEU_DAU_KY(PLTransaction plTrans, long ky_id)
        {
            try
            {
                DatabaseFB db = plTrans.db;
                DbTransaction dbTrans = plTrans.dbTrans;

                string table_name = "KHO_TON_KHO_" + ky_id + "_DAU_KY";
                int tableCount = CheckTableExist(plTrans, table_name);
               
                if (tableCount > 0)
                {
                    string sql = "drop table " + table_name;
                    DbCommand drop_tb = db.GetSQLStringCommand(sql);
                    db.ExecuteNonQuery(drop_tb, dbTrans);
                }
                return true;
            }
            catch
            {
                return false;
            }
        }

        /// <summary>
        /// Xóa bảng dữ liệu trong kì của kỳ kinh doanh chỉ định
        /// </summary>
        /// <param name="ky_id">Kỳ kinh doanh cần xóa bảng</param>
        public static bool DeleteTableDU_LIEU_TRONG_KY(PLTransaction plTrans, long ky_id)
        {
            try
            {
                DatabaseFB db = plTrans.db;
                DbTransaction dbTrans = plTrans.dbTrans;

                string table_name = "KHO_TON_KHO_" + ky_id;
                int tableCount = CheckTableExist(plTrans, table_name);
                
                if (tableCount > 0)
                {
                    string sql = "drop table " + table_name;
                    DbCommand drop_tb = db.GetSQLStringCommand(sql);
                    db.ExecuteNonQuery(drop_tb, dbTrans);
                }
                return true;
            }
            catch 
            {
                return false;
            }
        } 

        /// <summary>
        /// Cập nhật hàng tồn kho khi xóa phiếu Nhập/Xuất
        /// hay khi loại bỏ 1 số hàng hóa ra khỏi 1 phiếu Nhập/Xuất nào đó
        /// </summary>
        /// <param name="plTrans">Đối tượng Transaction</param>
        /// <param name="ngay_phat_sinh">Ngày phát sinh phiếu</param>
        /// <param name="IsNhap">Nhập/Xuất</param>
        /// <param name="hh_id">ID hàng hóa</param>
        /// <param name="kho_id">ID kho</param>
        /// <param name="tinh_trang_hh">ID tình trạng</param>
        /// <param name="so_luong">Số lượng</param>
        /// <param name="trong_luong">Trọng lượng</param>
        /// <param name="IUD">Insert/Update/Delete(1/2/3)</param>
        public static void CapNhatNhapXuatHangTon(PLTransaction plTrans, long ky_id, bool IsNhap,
            long hh_id, long kho_id, long tinh_trang_hh, decimal so_luong, decimal trong_luong, int IUD)
        {
            DatabaseFB db = plTrans.db;

            //DbCommand cmd1 = db.GetStoredProcCommand("FW_KY_GET_KY_KD");
            //db.AddInParameter(cmd1, "@I_NGAY", DbType.DateTime, ngay_phat_sinh);
            //DataSet ds = new DataSet();
            //plTrans.LoadDataSet(ds, cmd1, "NOOP");
            //DataTable dt = ds.Tables[0];
            //long KyID = HelpNumber.ParseInt64(dt.Rows[0][0]);

            //Cập nhật giảm Nhập/Xuất kho
            CapNhatTonKho(plTrans, ky_id, IsNhap, hh_id, kho_id, tinh_trang_hh,
                so_luong, trong_luong, IUD);               
        }

        /// <summary>
        /// Cập nhật chuyển kho hàng tồn kho khi xóa phiếu chuyển kho
        /// hay khi loại bỏ 1 số hàng hóa ra khỏi 1 phiếu chuyển kho nào đó
        /// </summary>
        /// <param name="plTrans">Đối tượng Transaction</param>
        /// <param name="ngay_phat_sinh">Ngày phát sinh phiếu</param>        
        /// <param name="hh_id">ID hàng hóa</param>       
        /// <param name="tinh_trang_hh">ID tình trạng</param>
        /// <param name="so_luong">Số lượng</param>
        /// <param name="trong_luong">Trọng lượng</param>
        /// <param name="kho_id1">ID kho 1</param>
        /// <param name="kho_id2">ID kho 2</param>
        /// <param name="IUD">Insert/Update/Delete(1/2/3)</param>
        public static void CapNhatChuyenKhoHangTon(PLTransaction plTrans, long ky_id,
            long hh_id, long tinh_trang_hh, decimal so_luong, decimal trong_luong, long kho_id1, long kho_id2, int IUD)
        {
            //DatabaseFB db = plTrans.db;

            //DbCommand cmd1 = db.GetStoredProcCommand("FW_KY_GET_KY_KD");
            //db.AddInParameter(cmd1, "@I_NGAY", DbType.DateTime, ngay_phat_sinh);
            //DataSet ds = new DataSet();
            //plTrans.LoadDataSet(ds, cmd1, "NOOP");
            //DataTable dt = ds.Tables[0];
            //long KyID = HelpNumber.ParseInt64(dt.Rows[0][0]);

            //Cập nhật giảm xuất Kho nguồn
            CapNhatTonKho(plTrans, ky_id, false, hh_id, kho_id1, tinh_trang_hh, so_luong, trong_luong, IUD);
            //Cập nhật giảm nhập Kho đích
            CapNhatTonKho(plTrans, ky_id, true, hh_id, kho_id2, tinh_trang_hh, so_luong, trong_luong, IUD);
        }

        public static void CapNhatTonKho(PLTransaction plTrans, long kkd_id, bool IsNhap,
            long hh_id, long kho_id, long tinh_trang_hh, decimal so_luong, decimal trong_luong, int IUD)
        {
            DatabaseFB db = plTrans.db;
            DbTransaction trans = plTrans.dbTrans;
            try
            {
                DbCommand cmd = db.GetStoredProcCommand("KHO_TON_KHO_DAUKY_TONKHO");
                db.AddInParameter(cmd, "@I_HANG_HOA_ID", DbType.Int64, hh_id);
                db.AddInParameter(cmd, "@I_KHO_ID", DbType.Int64, kho_id);
                db.AddInParameter(cmd, "@I_TINH_TRANG", DbType.Int32, tinh_trang_hh);
                db.AddInParameter(cmd, "@I_TRONG_LUONG", DbType.Decimal, trong_luong);
                db.AddInParameter(cmd, "@I_SO_LUONG", DbType.Decimal, so_luong);
                db.AddInParameter(cmd, "@I_KKD_ID", DbType.Int64, kkd_id);
                if (IsNhap)
                    db.AddInParameter(cmd, "@I_DAUKY_NHAP_XUAT_DIEUCHINH", DbType.Int32, 2);
                else
                    db.AddInParameter(cmd, "@I_DAUKY_NHAP_XUAT_DIEUCHINH", DbType.Int32, 3);
                db.AddInParameter(cmd, "@I_INSERT_UPDATE_DELETE", DbType.Int32, IUD);
                db.ExecuteNonQuery(cmd, trans);                
            }
            catch { }
        }

        /// <summary>
        /// Cập nhật hàng tồn kho khi Insert/Update/Delete phiếu Nhập/Xuất/Chuyển        
        /// </summary>
        /// <param name="plTrans">Đối tượng Transaction</param>       
        /// <param name="Data">Đối tượng DOFWObjRelData</param>
        /// <param name="IUD">Insert/Update/Delete(1/2/3)</param>
        public static void CapNhatNhapXuatChuyen(PLTransaction plTrans, DOFWObjRelData Data, int IUD,long ky_id)
        {
            if (Data.INOUT1 == "IN" && Data.INOUT2 == "")
            {
                KhoTonKhoHelp.CapNhatNhapXuatHangTon(plTrans,ky_id,
                    true, Data.HH_ID, Data.KHO_ID1, Data.TINH_TRANG_HH, Data.SO_LG, Data.TONG_TR_LG, IUD);
                if (IUD != 3)
                {
                    KhoTonKhoHelp.UpdateGhiChu(plTrans, ky_id, 
                        Data.HH_ID, Data.KHO_ID1, Data.TINH_TRANG_HH, Data.GHI_CHU);                                
                }                
            }
            else if (Data.INOUT1 == "OUT" && Data.INOUT2 == "")
            {
                KhoTonKhoHelp.CapNhatNhapXuatHangTon(plTrans, ky_id,
                    false, Data.HH_ID, Data.KHO_ID1, Data.TINH_TRANG_HH, Data.SO_LG, Data.TONG_TR_LG, IUD);
            }
            else
            {
                KhoTonKhoHelp.CapNhatChuyenKhoHangTon(plTrans, ky_id,
                    Data.HH_ID, Data.TINH_TRANG_HH, Data.SO_LG, Data.TONG_TR_LG, Data.KHO_ID1, Data.KHO_ID2, IUD);
            }
        }   

        #region Not Use
        ///// <summary>
        ///// Lấy danh sách hàng hóa của phiếu có DesID dựa vào Map
        ///// (Hiện tại chưa cần sử dụng đến)
        ///// </summary>
        ///// <param name="DesID">ID của phiếu</param>
        ///// <param name="PinMap">Map chứa tên bảng, cột mà phiếu DesID thuộc về</param>
        ///// <returns></returns>
        //private static DataSet GetDsHangHoa(long DesID, DataTable PinMap)
        //{
        //    try
        //    {
        //        string TableName_CT = PinMap.Rows[0]["PINCT"] != null ?
        //            PinMap.Rows[0]["PINCT"].ToString() : "";
        //        string MaPhieu = PinMap.Rows[0]["PIN_MA_PHIEU"] != null ?
        //            PinMap.Rows[0]["PIN_MA_PHIEU"].ToString() : "";
        //        string HangHoa_ID = PinMap.Rows[0]["PIN_HANG_HOA"] != null ?
        //            PinMap.Rows[0]["PIN_HANG_HOA"].ToString() : "";
        //        string SoLuong = PinMap.Rows[0]["PIN_SO_LUONG"] != null ?
        //            PinMap.Rows[0]["PIN_SO_LUONG"].ToString() : "";
        //        string TrongLuong = PinMap.Rows[0]["PIN_TRONG_LUONG"] != null ?
        //            PinMap.Rows[0]["PIN_TRONG_LUONG"].ToString() : "";
        //        string DonGia = PinMap.Rows[0]["PIN_DON_GIA"] != null ?
        //            PinMap.Rows[0]["PIN_DON_GIA"].ToString() : "";
        //        string TTHTK_ID = PinMap.Rows[0]["PIN_TTHTK"] != null ?
        //            PinMap.Rows[0]["PIN_TTHTK"].ToString() : "";

        //        //Mặc định trường Hàng hóa ID luôn tồn tại trong phiếu DesID
        //        StringBuilder selectBuilder = new StringBuilder(HangHoa_ID + " as 'HH_ID'");
        //        if (SoLuong != "")
        //            selectBuilder.Append("," + SoLuong + " as 'SO_LUONG'");
        //        if (TrongLuong != "")
        //            selectBuilder.Append("," + TrongLuong + " as 'TRONG_LUONG'");
        //        if (DonGia != "")
        //            selectBuilder.Append("," + DonGia + " as 'DON_GIA'");
        //        if (TTHTK_ID != "")
        //            selectBuilder.Append("," + TTHTK_ID + " as 'TTHTK_ID'");

        //        string selectString = selectBuilder.ToString();
        //        if (selectString.Substring(0, 1).Equals(","))
        //            selectString = selectString.Substring(1);

        //        if (selectString != "" && TableName_CT != "" && MaPhieu != "")
        //        {
        //            QueryBuilder query = new QueryBuilder("select " + selectString +
        //            " from " + TableName_CT + " where 1=1");
        //            query.addID(MaPhieu, DesID);
        //            DataSet ds = DABase.getDatabase().LoadDataSet(query);
        //            return ds;
        //        }
        //        else
        //            return null;
        //    }
        //    catch (Exception ex)
        //    {
        //        PLException.AddException(ex);
        //        return null;
        //    }
        //}

        ///// <summary>
        ///// Kiểm tra bảng đã tồn tại trong DB hay chưa
        ///// </summary>
        ///// <param name="table_name">Tên bảng cần kiểm tra</param>
        ///// <returns>Số bảng tìm được (=0 -> bảng không tồn tại)</returns>
        //private static int CheckTableExist(string table_name)
        //{
        //    string sql = "SELECT COUNT(RDB$RELATION_NAME) as name " +
        //        "FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG=0 " +
        //        "AND RDB$VIEW_BLR IS NULL " +
        //        "AND (RDB$RELATION_NAME = '" + table_name + "')";
        //    DatabaseFB db = DABase.getDatabase();
        //    DbCommand check_tb = db.GetSQLStringCommand(sql);
        //    return (int)db.ExecuteScalar(check_tb);
        //}

        ///// <summary>
        ///// Tạo bảng dữ liệu đầu kì của kỳ kinh doanh chỉ định
        ///// </summary>
        ///// <param name="ky_id">Kỳ kinh doanh cần tạo bảng</param>
        //public static void CreateTableDU_LIEU_DAU_KY(long ky_id)
        //{
        //    string table_name = "KHO_TON_KHO_" + ky_id + "_DAU_KY";
        //    int tableCount = CheckTableExist(table_name);

        //    DatabaseFB db = DABase.getDatabase();
        //    if (tableCount == 0)
        //    {
        //        DbCommand create_tb = db.GetStoredProcCommand("KHO_TON_KHO_CREATE_DAU_KY");
        //        db.AddInParameter(create_tb, "@i_kkd_id", DbType.Int64, ky_id);
        //        db.ExecuteNonQuery(create_tb);
        //    }
        //}      

        ///// <summary>
        ///// Tạo bảng dữ liệu trong kì của kỳ kinh doanh chỉ định
        ///// </summary>
        ///// <param name="ky_id">Kỳ kinh doanh cần tạo bảng</param>
        //public static void CreateTableDU_LIEU_TRONG_KY(long ky_id)
        //{
        //    string table_name = "KHO_TON_KHO_" + ky_id;
        //    int tableCount = CheckTableExist(table_name);

        //    DatabaseFB db = DABase.getDatabase();
        //    if (tableCount == 0)
        //    {
        //        DbCommand create_tb = db.GetStoredProcCommand("KHO_TON_KHO_CREATE");
        //        db.AddInParameter(create_tb, "@i_kkd_id", DbType.Int64, ky_id);
        //        db.ExecuteNonQuery(create_tb);
        //    }
        //}        

        ///// <summary>
        ///// Lấy ID kỳ trước
        ///// </summary>
        ///// <param name="ky_id">Kỳ cần lấy kỳ trước nó</param>
        ///// <param name="loai_ky">Loại kỳ</param>
        ///// <returns></returns>
        //public static long GetKy_Truoc(long ky_id, DateTime ngay)
        //{
        //    DatabaseFB db = DABase.getDatabase();
        //    DbCommand cmd_Get = db.GetStoredProcCommand("FW_KY_KYTRUOC");
        //    db.AddInParameter(cmd_Get, "@i_ky_id", DbType.Int64, ky_id);
        //    db.AddInParameter(cmd_Get, "@i_ngay", DbType.DateTime, ngay);
        //    db.AddOutParameter(cmd_Get, "@o_ky_id", DbType.Int64, 1);
        //    db.ExecuteNonQuery(cmd_Get);
        //    object ky_truoc_id = db.GetParameterValue(cmd_Get, "@o_ky_id");
        //    if (ky_truoc_id != null)
        //        return HelpNumber.ParseInt64(ky_truoc_id);
        //    else
        //        return -1;
        //}

        ///// <summary>
        ///// Lấy ID kỳ sau
        ///// </summary>
        ///// <param name="ky_id">Kỳ cần lấy kỳ sau nó</param>
        ///// <param name="loai_ky">Loại kỳ</param>
        ///// <returns></returns>
        //public static long GetKy_Sau(long ky_id, DateTime ngay, DbTransaction dbTrans)
        //{
        //    DatabaseFB db = DABase.getDatabase();
        //    DbCommand cmd_Get = db.GetStoredProcCommand("FW_KY_KYSAU");
        //    db.AddInParameter(cmd_Get, "@i_ky_id", DbType.Int64, ky_id);
        //    db.AddInParameter(cmd_Get, "@i_ngay", DbType.DateTime, ngay);
        //    db.AddOutParameter(cmd_Get, "@o_ky_id", DbType.Int64, 1);
        //    db.ExecuteNonQuery(cmd_Get);
        //    object ky_sau_id = db.ExecuteScalar(cmd_Get, dbTrans);
        //    if (ky_sau_id != null)
        //        return HelpNumber.ParseInt64(ky_sau_id);
        //    else
        //        return -1;
        //}          

        ///// <summary>
        ///// Nhóm bảng theo HH_ID, KHO_ID, TINH_TRANG_HH
        ///// </summary>
        ///// <param name="dt_group">DataTable cần nhóm</param>
        ///// <returns>DataTable đã nhóm</returns>
        //private static DataTable GroupTable_INOUT(DataTable dt_group)
        //{
        //    DataTable dt_last = dt_group.Clone();
        //    DataTable dt_distinct = RangBuocSoLgTrLgHelp.SelectDistinct(dt_group, "HH_ID", "KHO_ID", "TINH_TRANG_HH");
        //    foreach (DataRow dr in dt_distinct.Rows)
        //    {
        //        DataRow _dr = dt_last.NewRow();
        //        _dr["HH_ID"] = dr["HH_ID"];
        //        _dr["KHO_ID"] = dr["KHO_ID"];
        //        _dr["TINH_TRANG_HH"] = dr["TINH_TRANG_HH"];
        //        _dr["SO_LUONG"] = dt_group.Compute("Sum(SO_LUONG)", "HH_ID='" + dr["HH_ID"] +
        //            "' and KHO_ID='" + dr["KHO_ID"] + "' and TINH_TRANG_HH='" + dr["TINH_TRANG_HH"] + "'");
        //        _dr["TRONG_LUONG"] = dt_group.Compute("Sum(TRONG_LUONG)", "HH_ID='" +
        //            dr["HH_ID"] + "' and KHO_ID='" + dr["KHO_ID"] + "' and TINH_TRANG_HH='" + dr["TINH_TRANG_HH"] + "'");
        //        dt_last.Rows.Add(_dr);
        //    }
        //    return dt_last;
        //}          
        #endregion
    }
}
